// 计算指数移动平均值 (EMA)
// double calculateEMA(List<double> prices, int period) {
//   if (prices.length < period) return 0; // 如果数据不足，返回 0

//   // 初始值：SMA (简单移动平均)
//   double sum = 0;
//   for (int i = 0; i < period; i++) {
//     sum += prices[i];
//   }
//   double ema = sum / period; // 初始 EMA

//   // 计算 EMA 递推
//   double multiplier = 2 / (period + 1); // multiplier 是常数

//   // 从 period 开始逐步计算
//   for (int i = period; i < prices.length; i++) {
//     ema = (prices[i] - ema) * multiplier + ema;
//   }

//   return ema;
// }

double calculateEMA(List<double> prices, int period) {
  if (prices.isEmpty) return 0;

  double alpha = 2 / (period + 1); // 平滑因子
  double ema = prices.first; // 使用第一个价格作为初始值

  for (int i = 1; i < prices.length; i++) {
    ema = (prices[i] - ema) * alpha + ema;
  }

  return ema;
}

// 计算 MACD 线
List<double> calculateMACD(List<double> closingPrices) {
  List<double> ema12 = [];
  List<double> ema26 = [];
  List<double> macdLine = [];

  // 计算 ema12 和 ema26
  for (int i = 0; i < closingPrices.length; i++) {
    if (i >= 12) {
      double ema12Value =
          calculateEMA(closingPrices.sublist(i - 12, i + 1), 12);
      ema12.add(ema12Value);
    }
    if (i >= 26) {
      double ema26Value =
          calculateEMA(closingPrices.sublist(i - 26, i + 1), 26);
      ema26.add(ema26Value);
    }
  }

  // 计算 macdLine
  for (int i = 26; i < closingPrices.length; i++) {
    double macd = ema12[i - 12] - ema26[i - 26];
    macdLine.add(macd);
  }

  return macdLine;
}

// 计算 Signal Line
List<double> calculateSignalLine(List<double> macdLine) {
  List<double> signalLine = [];
  for (int i = 0; i < macdLine.length; i++) {
    if (i >= 8) {
      double signal =
          calculateEMA(macdLine.sublist(i - 8, i + 1), 9); // 9 日 EMA
      signalLine.add(signal);
    }
  }
  return signalLine;
}

// 计算 Histogram
List<double> calculateHistogram(
    List<double> macdLine, List<double> signalLine) {
  List<double> histogram = [];
  for (int i = 0; i < macdLine.length; i++) {
    if (i < signalLine.length) {
      histogram.add(macdLine[i] - signalLine[i]);
    }
  }
  return histogram;
}


// 计算 MACD 和信号线
// List<List<double>> calculateMACD(List<double> closingPrices) {
//   List<double> macdLine = [];
//   List<double> signalLine = [];
//   List<double> histogram = [];

//   List<double> ema12 = [];
//   List<double> ema26 = [];

//   for (int i = 0; i < closingPrices.length; i++) {
//     // 计算 EMA12 和 EMA26
//     if (i >= 12) {
//       double ema12Value =
//           calculateEMA(closingPrices.sublist(i - 12, i + 1), 12);
//       ema12.add(ema12Value);
//       print('ema12[$i]: $ema12Value');
//       // ema12.add(
//       //     calculateEMA(closingPrices.sublist(i - 12, i + 1), 12)); // 12-day EMA
//     }
//     if (i >= 26) {
//       // ema26.add(
//       //     calculateEMA(closingPrices.sublist(i - 26, i + 1), 26)); // 26-day EMA
//       double ema26Value =
//           calculateEMA(closingPrices.sublist(i - 26, i + 1), 26);
//       ema26.add(ema26Value);
//       print('ema26[$i]: $ema26Value');
//     }

//     // 计算 MACD 线（只在数据足够时进行计算）
//     if (i >= 26) {
//       double macd = ema12[i - 12] - ema26[i - 26];
//       macdLine.add(macd);
//       print('macdLine[$i]: $macd');

//       // 计算信号线（Signal Line） 9日 EMA
//       if (macdLine.length >= 9) {
//         double signal = calculateEMA(macdLine.sublist(macdLine.length - 9), 9);
//         signalLine.add(signal);
//         print('signalLine[$i]: $signal');

//         // 计算柱状图（Histogram）
//         double hist = macd - signal;
//         histogram.add(hist);
//         print('histogram[$i]: $hist');
//       } else {
//         signalLine.add(0); // 信号线不足时填充为 0
//         histogram.add(0); // 背离部分填充为 0
//       }
//     }
//   }

//   return [macdLine, signalLine, histogram];
// }
